package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	s1 := make([]int, 3, 4)
	s2 := append(s1, 1)
	// s1、s2内各有什么元素
	/*
		s1 [0 0 0], len3, cap 4
		s2 [0 0 0 1], len 4, cap 4
	*/

	fmt.Printf("s1: %v %d %d, s2: %v %d %d\n", s1, len(s1), cap(s1), s2, len(s2), cap(s2))
	fmt.Println("~~~~~~~~~~~~~~~")
	// s1修改一个元素会影响s2吗？s2修改一个元素会影响s1吗？
	/*
		s1修改一个元素会影响s2
		s2修改一个元素可能会，也可能不会影响到s1
	*/

	s1[0] = 100
	fmt.Printf("s1: %v %d %d, s2: %v %d %d\n", s1, len(s1), cap(s1), s2, len(s2), cap(s2))

	s2[1] = 200
	fmt.Printf("s1: %v %d %d, s2: %v %d %d\n", s1, len(s1), cap(s1), s2, len(s2), cap(s2))

	s2[3] = 700
	fmt.Printf("s1: %v %d %d, s2: %v %d %d\n", s1, len(s1), cap(s1), s2, len(s2), cap(s2))
	fmt.Println("~~~~~~~~~~~~~~~")
	// s2增加一个元素会怎样
	/*
		s2标头值（地址）不变
		底层数据会扩容，len 5，cap 8
	*/

	fmt.Printf("%v %d %d %p %p\n", s2, len(s2), cap(s2), &s2, &s2[0])
	s2 = append(s2, 900)
	fmt.Printf("%v %d %d %p %p\n", s2, len(s2), cap(s2), &s2, &s2[0])
	fmt.Println("1. ~~~~~~~~~~~~~~~")

	// 有一个数组 [1,4,9,16,2,5,10,15]，生成一个新切片，要求新切片元素是数组相邻2项的和。
	/*
		数组相邻两项的和：5、13、25、18、7、15、25
		新切片：[5]、[15]
	*/

	var arr1 = [8]int{1, 4, 9, 16, 2, 5, 10, 15}
	var tmp int = 0
	//var s []int
	//var s = []int{}
	s := make([]int, 0, 5)

	for i := 0; i < len(arr1)-1; i++ {
		tmp = arr1[i] + arr1[i+1]

		for i := 0; i < len(arr1); i++ {
			if arr1[i] == tmp {
				//fmt.Println(tmp)
				s = append(s, tmp)
			}
		}
	}
	fmt.Printf("%T, %[1]v\n", s)
	fmt.Println("2. ~~~~~~~~~~~~~~~")

	// 数字重复统计
	// 1.随机产生100个整数
	// 2.数字的范围[-100, 100]
	// 3.降序输出这些生成的数字并打印其重复的次数

	//var arr = [100]int{}
	//var arr [100]int
	arr := [100]int{}

	src := rand.NewSource(time.Now().UnixNano())
	gen := rand.New(src)

	for i := 0; i < 100; i++ {
		arr[i] = gen.Intn(200) - 100
	}
	fmt.Println(len(arr), arr)

	// bubble sort
	var temp int
	//var temp int = 0
	/*
		var (
			temp int
		)
	*/

	for i := 0; i < len(arr); i++ {
		for j := 0; j < len(arr)-i-1; j++ {
			if arr[j] > arr[j+1] {
				temp = arr[j]
				arr[j] = arr[j+1]
				arr[j+1] = temp
			}
		}
	}
	fmt.Println(len(arr), arr)

	for i := len(arr) - 1; i >= 0; i-- {
		fmt.Printf("%v,", arr[i])
	}
	fmt.Println("\n~~~~~~~~~~~~~~~")

	// map
	m := make(map[int]int)
	for i := 0; i < len(arr); i++ {
		if _, ok := m[arr[i]]; !ok {
			m[arr[i]] = 1
		} else {
			m[arr[i]] += 1
		}
	}
	for k, v := range m {
		fmt.Println(k, v)
	}

	fmt.Println("3. ~~~~~~~~~~~~~~~")
}

// 批改意见
// 1. Intn(200)的范围是[0, 200)，会漏掉最后一个值
// 2. 尝试在倒序输出同时输出它的统计次数